import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class PrimeTest {
	int times=20;
	List<BigInteger> judges= new ArrayList<>();
	Random random=new Random();
	BigInteger n;
	public PrimeTest(BigInteger n) {
		this.n=n;
		int numBits=8;
		if (n.bitLength()>16) {
			numBits=16;
		}
		while (judges.size()<times) {
			BigInteger judge=new BigInteger(numBits, random);
			judges.add(judge);
		}
		
	}


	public boolean runTest() {
		boolean ret=false;
		String nStr=n.toString(10);
		int last=Integer.parseInt(nStr.substring(nStr.length()-1), 10);
		if (last%2==0) {
			//System.out.println("偶数");
		}else {
			BigInteger a=new BigInteger("2");		
			
			
			boolean fermat=false;
			BigInteger minusOne = n.subtract(BigInteger.ONE); 
			if (!a.modPow(minusOne, n).equals(BigInteger.ONE)) {
				
			}else {
				fermat=true;
			}
			int r = minusOne.getLowestSetBit();
			BigInteger d = minusOne.shiftRight(r);
	        //System.out.println("r:"+r);
	        //System.out.println("d:"+d);//2^r*d
	        for (int i = 0; i < judges.size(); i++) {
	        	BigInteger judge=judges.get(i);
	        	if (judge.compareTo(n)==1) {
					continue;
				}
	        	BigInteger modPow=judge.modPow(d, n);
	        	if ((modPow.equals(BigInteger.ONE))||(modPow.equals(minusOne))) {
	        		ret=true;
	        		continue;
				}else {
					int j=1;
					while (j<r) {
						modPow=modPow.modPow(BigInteger.valueOf(2), n);
						if ((modPow.equals(BigInteger.ONE))||(modPow.equals(minusOne))) {
							ret=true;
							break;
						}else {
							ret=false;
							j++;
						}
					}
				}
	        	if (!ret) {
					break;
				}
			}
	        if (fermat!=ret) {
	        	FakePrime.fakePrime=n;
			}
	        if (ret) {
	        	FakePrime.primeVector.add(n);
	        	FakePrime.primeCount++;
			}
	        //System.out.println("判断结果"+ret);
		}
		return ret;
		
	}

}
